package Persistencia;

import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Vector;

import Controlador.Utils;
import Negocio.Cereal;
import Negocio.Cosecha;

public class AdmPersistenciaCosecha extends AdministradorPersistencia {

	private static AdmPersistenciaCosecha instancia;

	public static AdmPersistenciaCosecha getInstancia() {
		if (instancia == null)
			return new AdmPersistenciaCosecha();
		return instancia;
	}

	@Override
	public void borrar(Object d) {
		// TODO Hacer funcionalidad
	}

	@Override
	public Long insertar(Object o) {
		try {
			Cosecha a = (Cosecha) o;
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("insert into Cosecha values (?,?,?,?,?,?)");

			s.setDate(1, Date.valueOf(a.getFechaInicioPeriodo()));
			s.setDate(2, Date.valueOf(a.getFechaFinPeriodo()));
			s.setDouble(3, a.getCantidadCosechada());
			s.setLong(4, a.getCerealCosechado().getCodigo());
			s.setLong(5, a.getLote());
			s.setString(6, Utils.CONSTANTE_ACTIVO);

			s.execute();
			PoolConnection.getPoolConnection().realeaseConnection(con);
			s = con.prepareStatement("select max(codigo) from cosecha");
			ResultSet result = s.executeQuery();
			Long res = null;
			if (result.next())
				res = result.getLong(1);
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return res;

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// TODO Exception
		System.out.println("No se pudo insertar el elemento");
		return null;

	}

	@Override
	public Vector<Object> buscarTodos() {
		try {

			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("select * from Cosecha ");
			Vector<Object> cos = new Vector<Object>();
			ResultSet res = s.executeQuery();
			while (res.next()) {
				Cereal cer = (Cereal) AdmPersistenciaCereal.getInstancia()
						.buscarPorCodigo(res.getLong(5));
				cos.add(new Cosecha(res.getLong(1), res.getString(2), res
						.getString(3), res.getDouble(4), cer, res.getLong(6),
						res.getString(7)));

			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return cos;

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// TODO Exception
		System.out.println("No se pudo insertar el elemento");
		return null;
	}

	@Override
	public Object buscarPorCodigo(Object o) {
		try {
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("select * from Cosecha where codigo = ? ");
			Cosecha cos = null;
			s.setLong(1, (Long) o);

			ResultSet res = s.executeQuery();
			if (res.next()) {
				Cereal cer = (Cereal) AdmPersistenciaCereal.getInstancia()
						.buscarPorCodigo(res.getLong(5));
				cos = new Cosecha(res.getLong(1), res.getString(2), res
						.getString(3), res.getDouble(4), cer, res.getLong(6),
						res.getString(7));

			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return cos;

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// TODO Exception
		System.out.println("No se pudo insertar el elemento");
		return null;
	}

	@Override
	public void modificar(Object o) {
		try {
			Cosecha a = (Cosecha) o;
			Connection con = PoolConnection.getPoolConnection().getConnection();
			PreparedStatement s = con
					.prepareStatement("update Cosecha set iniPeriodo = ?, finPeriodo = ?, cantidad = ?, cereal = ?, nroLote =? , estado = ? where codigo = ? ");
			
			s.setDate(1, Date.valueOf(a.getFechaInicioPeriodo()));
			s.setDate(2, Date.valueOf(a.getFechaFinPeriodo()));
			s.setDouble(3, a.getCantidadCosechada());
			s.setLong(4, a.getCerealCosechado().getCodigo());
			s.setLong(5, a.getLote());
			s.setString(6, a.getEstado());
			s.execute();

			PoolConnection.getPoolConnection().realeaseConnection(con);

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// TODO Exception
		System.out.println("No se pudo insertar el elemento");

	}

	public Cosecha buscarUltimaLote(long codigo) {
		try {
			Connection con = PoolConnection.getPoolConnection().getConnection();

			PreparedStatement s = con
					.prepareStatement("select max(idcosecha) from Cosecha_lote where nroLote = ? ");
			s.setLong(1, codigo);

			ResultSet res = s.executeQuery();
			Cosecha cos = null;
			if (res.next()) {
				s = con.prepareStatement("select * from Cosecha where codigo = ? ");
				
				s.setLong(1, res.getLong(1));

				ResultSet res1 = s.executeQuery();
				if (res1.next()) {
					Cereal cer = (Cereal) AdmPersistenciaCereal.getInstancia()
							.buscarPorCodigo(res1.getLong(5));
					cos = new Cosecha(res1.getLong(1), res1.getString(2), res1.getString(3), res1.getDouble(4), cer, 
							res1.getLong(6), res1.getString(7));

				}
			}
			PoolConnection.getPoolConnection().realeaseConnection(con);
			return cos;

		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// TODO Exception
		System.out.println("No se pudo insertar el elemento");
		return null;
	}

}
